home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagg_m.zip / INTERRUP.SWG / 0016_How to Grab Interrupts.pas < prev    next >
Pascal/Delphi Source File  |  1994-02-03  |  1KB  |  55 lines

  1. Uses Dos;
  2. var
  3.      ExitSave,
  4.      BKDISave,
  5.      BKDIHandler       : Pointer;
  6.      Regs              : Registers;
  7.      Abort             : Boolean;
  8.  
  9. {$F+}
  10. procedure NewCntlBreakHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word);
  11. interrupt;
  12. begin
  13. inline($FA);  { disable interrupts }
  14.               { do nada widda data }      { OR DO ANYTHING YOU WANT }
  15. inline($FB);  { enable interrupts }
  16. Abort := True;         { Use this for (while NOT abort do..) }
  17. end;
  18.  
  19. procedure NewBKDIHandler(Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word);
  20. interrupt;
  21. begin
  22. inline($FA);  { disable interrupts }
  23.               { do nada widda data }      { OR DO ANYTHING YOU WANT }
  24. inline($FB);  { enable interrupts }
  25. AX := 0;      {This must remain. An oversight in Turbo Pascal.}
  26. end;
  27.  
  28. procedure MyExit;
  29. begin
  30.      ExitProc := ExitSave;
  31.      SetIntVec($1B, BKDISave);
  32.      SetIntVec($24, BKDIHandler);
  33. end;
  34. {$F-}
  35.  
  36.  
  37. begin
  38.      ExitSave := ExitProc;
  39.      ExitProc := @MyExit;
  40.      Regs.AH := $35;    { Get Cntl-Break Interrupt Vector }
  41.      Regs.AL := $1B;
  42.      Intr($21,Regs);
  43.      BKDISave := Ptr(Regs.ES, Regs.BX);
  44.      SetIntVec($1B, @NewBKDIHandler);
  45.      Regs.AH := $35;    { Get Cntl-Break Handler Interrupt Vector }
  46.      Regs.AL := $23;
  47.      Intr($21,Regs);
  48.      BKDIHandler := Ptr(Regs.ES, Regs.BX);
  49.      SetIntVec($23, @NewCntlBreakHandler);
  50.  
  51.      { Do whatever here. When finished, the old interrupt vectors are
  52.        restored in the MyExit procedure }
  53. end.
  54.  
  55.